using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing.Imaging;using System.Text;using System.Windows;using System.Windows.Forms;using System.IO;using System.Windows.Media.Imaging;using AForge;using AForge.Controls;using AForge.Video;using AForge.Video.DirectShow;using Size = System.Drawing.Size;using System.Drawing;using System.Linq;using System.IO.Ports;using Emgu.CV;using Emgu.CV.Structure;using JoyKeys;using Microsoft.Win32; using System.Runtime.InteropServices;using System.Diagnostics;using System.Threading;using JoyKeys.Voluntary;namespace OperateCamera{ public partial class Form1 : Form { Thread[] workThreads = new Thread[10]; static int lx, ly, lrt, lrb_xyab = 0, lxy = 65535, rx, ry; static int lx_mid = 0, ly_mid = 0, rx_mid = 0, ry_mid = 0, lrt_mid = 0; static string s; /// <summary> /// 手柄定义 static string sxdy; static string xyba; static string diretion; /// </summary> static bool joy = false; static bool joyInit = false; private const int statLength = 15; private int statIndex = 0; private int statReady = 0; private int[] statCount = new int[statLength]; int time1 = 0; static byte[] SendBytes = new byte[24]; int count;//用于定时器计数 int time;//存储设定的定时值 //device 1 const byte DeviceOpen1 = 0x01; const byte DeviceClose1 = 0x81; //device 2 const byte DeviceOpen2 = 0x02; const byte DeviceClose2 = 0x82; //device 3 const byte DeviceOpen3 = 0x03; const byte DeviceClose3 = 0x83; //device 4 const byte DeviceOpen4 = 0x04; const byte DeviceClose4 = 0x84; //SerialPort Write Buffer bool Button1Statue; byte[] SerialPortDataBuffer = new byte[1]; private FilterInfoCollection videoDevices; //private VideoCaptureDevice videoSource; public Form1() { workThreads[0] = new Thread(new ThreadStart(joystic)); workThreads[0].Name = "t0"; workThreads[0].Start(); workThreads[0].IsBackground = true; InitializeComponent(); System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; } public static void joystic() { int x = 0; JoystickAPI.JOYINFOEX infoEx = new JoystickAPI.JOYINFOEX(); while (true) { infoEx.dwSize = Marshal.SizeOf(typeof(JoystickAPI.JOYINFOEX)); infoEx.dwFlags = (int)JoystickAPI.JOY_RETURNBUTTONS; JoystickAPI.joyGetPosEx(JoystickAPI.JOYSTICKID1, ref infoEx); int A = infoEx.dwButtonNumber; lx = infoEx.dwXpos / 3200; ly = infoEx.dwYpos / 3200; lrt = infoEx.dwZpos/3200; lrb_xyab = infoEx.dwButtons; rx = infoEx.dwUpos; ry = infoEx.dwRpos / 3200; lxy = infoEx.dwPOV; s = infoEx.dwXpos.ToString() "\t" //左摇杆 左右 infoEx.dwYpos.ToString() "\r\n" //左摇杆 上下 infoEx.dwZpos.ToString() "\t" //LT RT infoEx.dwButtons.ToString() "\r\n" //A B X Y LB RB back start infoEx.dwUpos.ToString() "\t" //右摇杆 左右 infoEx.dwRpos.ToString() "\r\n" //右摇杆 上下infoEx.dwPOV.ToString();//上下左右 sxdy = infoEx.dwPOV.ToString();//上下左右 xyba = infoEx.dwButtons.ToString();//A B X Y LB RB back start diretion = lx.ToString() "\t" //左摇杆 左右 ly.ToString() "\r\n" //左摇杆 上下 lrt.ToString() "\t" //右摇杆 左右 ry.ToString() "\r\n"; //右摇杆 上下 if ((lrb_xyab & 0x80) != 0) { joyInit = false; } if ((lx ly rx ry) == 0) { joy = false; } else { joy = true; } if (joyInit == false && joy == true) { lx_mid = infoEx.dwXpos / 3200; ly_mid = infoEx.dwYpos / 3200; lrt_mid = infoEx.dwZpos / 3200; rx_mid = infoEx.dwUpos; ry_mid = infoEx.dwRpos / 3200; joyInit = true; } } } private void Form1_Load(object sender, EventArgs e) { SearchAndAddSerialToComboBox(serialPort1, comboBox1); serialPort1.DataReceived = new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序 } private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件 { } private void WriteByteToSerialPort(byte data) //单字节写入串口 { } private void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox) { //将可用端口号添加到ComboBox string[] MyString = new string[20]; //最多容纳20个,太多会影响调试效率 string Buffer; //缓存 MyBox.Items.Clear(); //清空ComboBox内容 for (int i = 1; i < 20; i ) //循环 { try //核心原理是依靠try和catch完成遍历 { Buffer = "COM" i.ToString(); MyPort.PortName = Buffer; MyPort.Open(); //如果失败,后面的代码不会执行 MyString[i - 1] = Buffer; MyBox.Items.Add(Buffer); //打开成功,添加至下俩列表 MyPort.Close(); //关闭 } catch { } } MyBox.Text = MyString[0]; //初始化 } private void btnConnect_Click(object sender, EventArgs e) { CameraConn(); } //连接摄像头 private void CameraConn() { } private void CameraConn1() { } //关闭摄像头 private void btnClose_Click(object sender, EventArgs e) { videoSourcePlayer.SignalToStop(); videoSourcePlayer.WaitForStop(); } //主窗体关闭 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { btnClose_Click(null, null); } //拍照 private void Photograph_Click(object sender, EventArgs e) { } private string GetImagePath() { string personImgPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) Path.DirectorySeparatorChar.ToString() "PersonImg"; if (!Directory.Exists(personImgPath)) { Directory.CreateDirectory(personImgPath); } return personImgPath; } private void videoSourcePlayer_Click(object sender, EventArgs e) { } private void groupBox6_Enter(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) //串口打开就关闭 { try { serialPort1.Close(); } catch { } //确保万无一失 //button1.Text = "打开串口"; button1.BackgroundImage = Properties.Resources.Image2; //灭 Button1Statue = false; //按钮状态 } else { try { serialPort1.PortName = comboBox1.Text; //端口号 serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//十进制数据转换 serialPort1.Open(); //打开端口 //button1.Text = "关闭串口"; button1.BackgroundImage = Properties.Resources.Image1;//亮 Button1Statue = true; //按钮状态 } catch { MessageBox.Show("串口打开失败", "错误"); } } } private void button1_MouseHover(object sender, EventArgs e) { button1.BackgroundImage = Properties.Resources.Image3;//鼠标指上去则使用Image3 } private void button1_MouseLeave(object sender, EventArgs e) { if (Button1Statue) //鼠标移开,返回原来状态 { button1.BackgroundImage = Properties.Resources.Image1; } else { button1.BackgroundImage = Properties.Resources.Image2; } } private void button2_Click(object sender, EventArgs e) { int i = 0; try { i = Convert.ToInt32(textBox1.Text.Substring(0, 2)); //先处理两位数,如果出错就处理一位数 } catch { try { i = Convert.ToInt32(textBox1.Text.Substring(0, 1));//处理一位数 } catch { MessageBox.Show("请输入正确的数字"); //错误提示 return; //退出函数 } } if (serialPort1.IsOpen) //避免定时器浪费时间和用户等待 { if (i == 0) //如果是0的话程序认为是定时模式关 { //MessageBox.Show("请输入大于0的数字","提示");//WriteByteToSerialPort(DeviceOpen1); return; } else { progressBar1.Value = 0; WriteByteToSerialPort(DeviceOpen1); //timer1.Interval = i * 1000; //可以这样写,不需要计数器 time = i;//得到设定定时值(整形) progressBar1.Maximum = time;//进度条最大数值 timer1.Start(); //开定时器 button2.Enabled = false; //开按钮不能按了… } } } private void button3_Click(object sender, EventArgs e) { try { timer1.Stop(); //如果定时器没开,则错误处理 } catch { } button2.Enabled = true; progressBar1.Value = 0; WriteByteToSerialPort(DeviceClose1); //器件一关 count = 0; } private void button5_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceOpen2); //器件二开 } private void button4_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceClose2); //器件二关 } private void button7_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceOpen3); //器件三开 } private void button6_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceClose3); //器件三关 } private void button8_Click(object sender, EventArgs e) { SearchAndAddSerialToComboBox(serialPort1, comboBox1); //扫描并讲课用串口添加至下拉列表 } private void timer1_Tick(object sender, EventArgs e) { count ;//记当前秒 progressBar1.Value = count;//设置进度条进度 if (count == time) { button2.Enabled = true; //开按钮可以按 timer1.Stop();//时间到,停止计时 WriteByteToSerialPort(DeviceClose1); //器件一关 count = 0; } } private void button11_Click(object sender, EventArgs e) { } private void button10_Click(object sender, EventArgs e) { } private void button9_Click(object sender, EventArgs e) { } private void tscbxCameras_SelectedIndexChanged(object sender, EventArgs e) { } private void btnConnect1_Click(object sender, EventArgs e) { CameraConn1(); } private void btnClose1_Click(object sender, EventArgs e) { } private void button12_Click(object sender, EventArgs e) { } private void button14_Click(object sender, EventArgs e) {//放大 } private void button15_Click(object sender, EventArgs e) { //放大 } private void button16_Click(object sender, EventArgs e) { } private void button17_Click(object sender, EventArgs e) { } private void button17_Click_1(object sender, EventArgs e) { } private void button13_Click(object sender, EventArgs e) { } private void button18_Click(object sender, EventArgs e) { } private void P1_ValueChanged(object sender, EventArgs e) { } private void timer2_Tick(object sender, EventArgs e) { } private void button9_Click_1(object sender, EventArgs e) { SendAndTextAdd(SendBytes, SendBytes.Length); } private void SendAndTextAdd(byte[] SendBytes, int SendByteLenth) { } private string ReceiveByteToHexArray(byte[] b, int len)//服务函数,十六进制显示 { int i = 0; byte[] a = new byte[len * 3]; for (i = 0; i < len; i ) { if (b[i] / 16 < 10) { a[i * 3] = Convert.ToByte(b[i] / 16 48); } else { a[i * 3] = Convert.ToByte(b[i] / 16 55); } if (b[i] % 16 < 10) { a[i * 3 1] = Convert.ToByte(b[i] % 16 48); } else { a[i * 3 1] = Convert.ToByte(b[i] % 16 55); } a[i * 3 2] = 32; } return System.Text.Encoding.ASCII.GetString(a); } private void Form1_KeyDown(object sender, KeyEventArgs e)//快捷键检测 { } private void Form1_KeyUp(object sender, KeyEventArgs e)//按键弹开,执行对应动作 { } private void groupBox5_Enter(object sender, EventArgs e) { } private void button10_Click_1(object sender, EventArgs e) { MJPEGStream mjpegSource = new MJPEGStream(textBox4.Text "?action=stream"); OpenVideoSource(mjpegSource); } private void OpenVideoSource(IVideoSource source) { this.Cursor = Cursors.WaitCursor; videoSourcePlayer.SignalToStop(); videoSourcePlayer.WaitForStop(); videoSourcePlayer.VideoSource = source; videoSourcePlayer.Start(); statIndex = statReady = 0; timer.Start(); this.Cursor = Cursors.Default; } private void OpenVideoSource1(IVideoSource source) { this.Cursor = Cursors.WaitCursor; videoSourcePlayer1.SignalToStop(); videoSourcePlayer1.WaitForStop(); videoSourcePlayer1.VideoSource = source; videoSourcePlayer1.Start(); statIndex = statReady = 0; timer.Start(); this.Cursor = Cursors.Default; } private void timer_Tick(object sender, EventArgs e) { IVideoSource videoSource = videoSourcePlayer.VideoSource; if (videoSource != null) { statCount[statIndex] = videoSource.FramesReceived; if ( statIndex >= statLength) statIndex = 0; if (statReady < statLength) statReady ; float fps = 0; for (int i = 0; i < statReady; i ) { fps = statCount[i]; } fps /= statReady; statCount[statIndex] = 0; } } private void button19_Click(object sender, EventArgs e) { try { if (videoSourcePlayer.IsRunning) { string picName1 = GetImagePath() "\\" "wu1" ".jpg"; this.pictureBox3.Load(picName1);//加载图片 BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( videoSourcePlayer.GetCurrentVideoFrame().GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); PngBitmapEncoder pE = new PngBitmapEncoder(); pE.Frames.Add(BitmapFrame.Create(bitmapSource)); string picName = GetImagePath() "\\" "3" ".jpg"; if (File.Exists(picName)) { File.Delete(picName); } using (Stream stream = File.Create(picName)) { pE.Save(stream); } //拍照完成后关摄像头并刷新同时关窗体 //if (videoSourcePlayer != null && videoSourcePlayer.IsRunning) //{ // videoSourcePlayer.SignalToStop(); // videoSourcePlayer.WaitForStop(); //} //this.Close(); this.pictureBox3.Load(picName);//加载图片 } } catch (Exception ex) { MessageBox.Show("摄像头异常:" ex.Message); } } private void button20_Click(object sender, EventArgs e) { videoSourcePlayer.SignalToStop(); videoSourcePlayer.WaitForStop(); } private void textBox5_TextChanged(object sender, EventArgs e) { } private void button13_Click_1(object sender, EventArgs e) { MJPEGStream mjpegSource = new MJPEGStream(textBox2.Text "?action=stream"); OpenVideoSource1(mjpegSource); } private void button14_Click_1(object sender, EventArgs e) { try { if (videoSourcePlayer1.IsRunning) { string picName1 = GetImagePath() "\\" "wu2" ".jpg"; this.pictureBox1.Load(picName1);//加载图片 BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( videoSourcePlayer1.GetCurrentVideoFrame().GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); PngBitmapEncoder pE = new PngBitmapEncoder(); pE.Frames.Add(BitmapFrame.Create(bitmapSource)); string picName = GetImagePath() "\\" "2" ".jpg"; if (File.Exists(picName)) { File.Delete(picName); } using (Stream stream = File.Create(picName)) { pE.Save(stream); } //拍照完成后关摄像头并刷新同时关窗体 //if (videoSourcePlayer != null && videoSourcePlayer.IsRunning) //{ // videoSourcePlayer.SignalToStop(); // videoSourcePlayer.WaitForStop(); //} //this.Close(); this.pictureBox1.Load(picName);//加载图片 } } catch (Exception ex) { MessageBox.Show("摄像头异常:" ex.Message); } } private void button15_Click_1(object sender, EventArgs e) { videoSourcePlayer1.SignalToStop(); videoSourcePlayer1.WaitForStop(); } private void button23_Click(object sender, EventArgs e) { } }}
评论